package org.jeecg.common.util;

import com.alibaba.fastjson.JSONObject;
import org.jeecg.common.api.vo.Result;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;

/**
 * 通过 RESTful 风格的接口操纵 desform 里的数据
 *
 * @author sunjianlei
 */
public class RestDesformUtil {

  private static String domain = null;
  private static String path = null;

  static {
    domain = SpringContextUtils.getDomain();
    path =
        oConvertUtils.getString(
            SpringContextUtils.getApplicationContext()
                .getEnvironment()
                .getProperty("server.servlet.context-path"));
  }

  /**
   * 查询数据
   *
   * @param desformCode
   * @param dataId
   * @param token
   * @return
   */
  public static Result queryOne(String desformCode, String dataId, String token) {
    String url = getBaseUrl(desformCode, dataId).toString();
    HttpHeaders headers = getHeaders(token);
    ResponseEntity<JSONObject> result =
        RestUtil.request(url, HttpMethod.GET, headers, null, null, JSONObject.class);
    return packageReturn(result);
  }

  /**
   * 新增数据
   *
   * @param desformCode
   * @param formData
   * @param token
   * @return
   */
  public static Result addOne(String desformCode, JSONObject formData, String token) {
    return addOrEditOne(desformCode, formData, token, HttpMethod.POST);
  }

  /**
   * 修改数据
   *
   * @param desformCode
   * @param formData
   * @param token
   * @return
   */
  public static Result editOne(String desformCode, JSONObject formData, String token) {
    return addOrEditOne(desformCode, formData, token, HttpMethod.PUT);
  }

  private static Result addOrEditOne(
      String desformCode, JSONObject formData, String token, HttpMethod method) {
    String url = getBaseUrl(desformCode).toString();
    HttpHeaders headers = getHeaders(token);
    ResponseEntity<JSONObject> result =
        RestUtil.request(url, method, headers, null, formData, JSONObject.class);
    return packageReturn(result);
  }

  /**
   * 删除数据
   *
   * @param desformCode
   * @param dataId
   * @param token
   * @return
   */
  public static Result removeOne(String desformCode, String dataId, String token) {
    String url = getBaseUrl(desformCode, dataId).toString();
    HttpHeaders headers = getHeaders(token);
    ResponseEntity<JSONObject> result =
        RestUtil.request(url, HttpMethod.DELETE, headers, null, null, JSONObject.class);
    return packageReturn(result);
  }

  private static Result packageReturn(ResponseEntity<JSONObject> result) {
    if (result.getBody() != null) {
      return result.getBody().toJavaObject(Result.class);
    }
    return Result.error("操作失败");
  }

  private static StringBuilder getBaseUrl() {
    StringBuilder builder = new StringBuilder(domain).append(path);
    builder.append("/desform/api");
    return builder;
  }

  private static StringBuilder getBaseUrl(String desformCode, String dataId) {
    StringBuilder builder = getBaseUrl();
    builder.append("/").append(desformCode);
    if (dataId != null) {
      builder.append("/").append(dataId);
    }
    return builder;
  }

  private static StringBuilder getBaseUrl(String desformCode) {
    return getBaseUrl(desformCode, null);
  }

  private static HttpHeaders getHeaders(String token) {
    HttpHeaders headers = new HttpHeaders();
    String mediaType = MediaType.APPLICATION_JSON_UTF8_VALUE;
    headers.setContentType(MediaType.parseMediaType(mediaType));
    headers.set("Accept", mediaType);
    headers.set("X-Access-Token", token);
    return headers;
  }
}
